home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
m68k
/
tutor.arc
/
GETA.SA
< prev
next >
Wrap
Text File
|
1990-01-05
|
7KB
|
226 lines
GETA IDNT 1,0 GET ADDRESS Subroutine 12/01/81
XDEF GETA
SPC 1
XREF GETNUMA
XREF.S OFFSET
XREF.S REGS
XREF SYNTAX
SPC 3
SECTION 11
* GET ADDRESS
* ENTER (A5) POINTER START OF BUFFER
* (A6) POINTER END OF BUFFER
*
* RETURN: D0 = ADDRESS
SPC 1
* (A6) POINTER END OF BUFFER
*
* RETURN: D0 = ADDRESS
SPC 2
* FORMATS HANDLED:
* 1. NUMBER DEFAULTS TO HEX
* 2. $NUMBER HEX
* 3. &NUMBER DECIMAL
* 4. (A@)
* 5. NUMBER(A@)
* 6. (A@,D@)
* 7. NUMBER(A@,D@)
* 8. [NUMBER] MEMORY INDIRECT
*
* FORMATS 1,2,3,8 ADD OFFSET R0 UNLESS R1 - R7 SPECIFIED
SPC 2
* WORK REGISTERS
* D4 VALUE BEING BUILT
*
* D5 FLAG REGISTER
* = 8000XXXX R@ GIVEN (GARO)
* = XXXX80XX [ GIVEN (GALB)
* = XXXXXX80 ( GIVEN (GALP)
*
* D6 FLAG REGISTER
* = 8000XXXX A@ GIVEN (GAAVF)
* = XXXX80XX NEED PLUS OR MINUS (GANPM)
* = XXXXXX2B + PLUS GIVEN (GAPMS)
* 2D - MINUS GIVEN
SPC 1
GETA MOVEM.L D4-D6/A0,-(A7) SAVE SOME REGISTERS
CLR.L D4 VALUE BEING BUILT
CLR.L D5 FLAG REG
CLR.L D6 FLAG REG
SPC 1
MOVE.B (A5)+,D0 GET BYTE
CMP.L A5,A6
BCS GAP191 END OF BUFFER
SPC 1
CMP.B #'[',D0
BNE.S GAP113
SPC 1
* [ SET INDIRECT
OR.W #$8000,D5 SET LEFT BRACKET (GALB)
SPC 1
GAP111 MOVE.B (A5)+,D0 GET BYTE
CMP.L A5,A6
BCS GAP191 END OF BUFFER
GAP113 DS 0
SPC 1
CMP.B #'+',D0
BEQ.S GAP121 PLUS SIGN
SPC 1
CMP.B #'-',D0
BEQ.S GAP121 MINUS SIGN
SPC 1
CMP.B #']',D0
BEQ.S GAP131 RIGHT BRACKET (INDIRECT)
SPC 1
CMP.B #'(',D0
BEQ.S GAP141 LEFT PARIN
SPC 1
CMP.B #',',D0
BEQ GAP161 COMMA
SPC 1
CMP.B #')',D0
BEQ GAP181 RIGHT PARIN
SPC 1
CMP.B #';',D0 "SEMI-COLON"
BEQ GAP191 TERMINATE
SPC 1
CMP.B #' ',D0 "SPACE"
BEQ GAP191 TERMINATE
SPC 1
TST.W D6 (GANPM)
BMI.S GAE NEEDS PLUS OR MINUS
SPC 1
CMP.B #'R',D0
BEQ GAP171 RELATIVE OFFSET
SPC 1
TST.B D6 (GALP)
BMI.S GAE (... NUMBER NOT ALLOWED
SPC 1
* NONE OF ABOVE ASSUME NUMERIC VALUE
SUB.L #1,A5 ADJUST (A5) TO FIRST CHAR
CLR.L D0
BSR GETNUMA
SPC 1
CMP.B #'-',D6 (GAPMS)
BEQ.S GAP118 MINUS SIGN
SPC 1
ADD.L D0,D4 PLUS SIGN
BRA.S GAP119
SPC 1
GAP118 SUB.L D0,D4
SPC 1
GAP119 CLR.B D6 (GAPMS) RESET PLUS MINUS FLAG
OR.W #$8000,D6 (GANPM) SET NEED PLUS MINUS
GAP111S BRA GAP111
SPC 1
* (*) (-) SET ARITHMETIC OPERATOR
GAP121 TST.B D6 (GAPMS)
BNE.S GAE MULTI OPERATORS
MOVE.B D0,D6 (GAPMS)
AND.W #$00FF,D6 RESET (GANPM) NEED PLUS MINUS
BRA GAP111S
SPC 1
* ] CLOSE INDIRECT
GAP131 TST.W D5 (GALB)
BPL.S GAE [ MISSING
SPC 1
* IF NO R@ GIVEN ADD R0
TST.L D5 (GARO)
BMI.S GAP135 R@ GIVEN
ADD.L OFFSET,D4 NO R@ GIVEN; ADD R0
GAP135 DS 0
SPC 1
MOVE.L D4,A0
MOVE.L (A0),D0
BRA GAP199
SPC 1
* ( DO PARIN PAIR
GAP141 TST.B D5 (GALP)
BMI.S GAE MULTI (
TST.L D5 (GARO)
BMI.S GAE R@ NOT ALLOWED WITH (..)
OR.B #$80,D5 (GALP) SET LEFT PAREN
SPC 1
* LEFT PARIN SET; MUST BE A@ NEXT
MOVE.B (A5)+,D0 GET BYTE
CMP.L A5,A6
BCS.S GAE
CMP.B #'A',D0
BNE.S GAE NOT A-REG
LEA REGS+32,A0
BSR.S GASRGN GET VALUE IN A@
ADD.L D1,D4
OR.L #$80000000,D6 (GAAVF) A-REG VALUE FLAG
BRA GAP111S
SPC 1
GAE BRA SYNTAX
SPC 1
* COMMA A-REG or
* COMMA D-REG REQUIRED
GAP161 TST.L D6 (GAAVF)
BPL GAE NO A-REG SPECIFIED
MOVE.B (A5)+,D0 GET BYTE
CMP.L A5,A6
BCS GAE
CMP.B #'A',D0
BNE.S GAP163
LEA REGS+32,A0 GET VALUE IN A@
BRA.S GAP165
GAP163 CMP.B #'D',D0
BNE GAE NOT D-REG
LEA REGS,A0 GET VALUE IN D@
GAP165 BSR.S GASRGN
ADD.L D1,D4
BRA GAP111S
SPC 1
* R@ OFFSET
GAP171 CMP.B #'+',D6 (GAPMS)
BNE GAE ONLY + ALLOWED
SPC 1
* ONLY ONE R@ ALLOWED
TST.L D5 (GARO)
BMI GAE MULIT R@
OR.L #$80000000,D5 SET R@ GIVEN (GARO)
SPC 1
LEA OFFSET,A0
BSR.S GASRGN GET VALUE IN R@
ADD.L D1,D4
BRA GAP119
SPC 1
* ) CLOSE THE WORLD
GAP181 TST.L D6 (GAAVF)
BPL GAE NO (
BRA.S GAP197
SPC 1
* SPACE TERMINATOR
GAP191 TST.W D5 (GALB)
BMI GAE [ WITHOUT ]
TST.B D5 (GALP)
BMI GAE ( WITHOUT )
SUB.L #1,A5 ADJUST CHAR POINTER
SPC 1
* IF NO R@ GIVEN ADD R0
TST.L D5 (GARO)
BMI.S GAP197 R@ GIVEN
ADD.L OFFSET,D4
GAP197 MOVE.L D4,D0
SPC 1
GAP199 MOVEM.L (A7)+,D4-D6/A0
RTS
SPC 1
* GET NEXT NUMBER
* A0 = POINTER TO TABLE OF VALUES
* D1 = VALUE ON RETURN
GASRGN CLR.L D0
MOVE.B (A5)+,D0 GET BYTE
CMP.L A5,A6
BCS GAE
SUB.B #'0',D0 ADJUST TO ZERO
CMP.B #7,D0
BHI GAE NOT 0 - 7
MULU #4,D0 4 * OFFSET
MOVE.L (A0,D0),D1
RTS
SPC 3
END